<?php
require_once 'protoweb/movimientos_protoweb.php';

/**
 * @package sisco
 * @subpackage controller
 */
class Movimientos extends Movimientos_protoweb
{
    public function create($remito_id)
    {
        // chequeo y obtengo el usuario loggeado
        $data['logueado'] = $this->getUsuarioLogueado();

        // valido permisos
        $gruposValidos = array();
        // ej. array('venta','logistica','contable','directivo');
        $this->validarPermisos($data['logueado'], $gruposValidos);

        // Get an empty object
        $data['movimiento'] = new Movimiento();
        $data['usuario']	= $data['logueado'];
        
        $data['remito'] 	= new Remito($remito_id);

        // Message Handler
        $data['msg'] = new PwMsgHandler();

        // prepare object attributes
        $this->createPrepare($data);

        // if posting, try to save the new object
        if ($this->input->server('REQUEST_METHOD') === 'POST') {
            $this->create_save($data);
        }

        $respuesta = array(
            'responseType' => 'html',
            'response'	   => $this->smartyview->smarty->fetch('movimiento_create.html', $data)
        );
        
        die(json_encode($respuesta));
    } // function create

    private function create_save($data) 
    {
        // assignCreatePost is defined on parent class and 
        // will assign all posting values to your attributes's class 
        // based on purposes definitions
        if ($this->assignCreatePost($data)) {

            // You could customize attributes here
			$this->load->model('Producto');
			$data['producto'] = new Producto($this->Producto->get_id_from_code($this->input->post('codigo-producto')));
            if ($data['producto']->loteable == "0") {
                $data['movimiento']->delete($data['lotes']);
            }
            else {
                $data['lote'] = new Lote();
                $data['lote']->where('codigo',$this->input->post('codigo-lote'))
                    ->where_related('producto','id',$data["producto"]->id)
                    ->get();
                
                if (!$data['lote']->id) {
                    $data['lote'] = new Lote();
                }
                $data['lote']->codigo = $this->input->post('codigo-lote');
                $data['lote']->fecha_vencimiento = $this->input->post('fecha-vencimiento');
                $data['lote']->save($data['producto']);
			}
            $data['movimiento']->fecha = $data['remito']->fecha;
            
            // Saving Object (feel free to edit)
            if ($this->saveEntity($data)) { 
            
                // post processing object attributes
                $this->afterCreateSuccess($data);

                // responde con éxito
                $respuesta = array(
                	'responseType' => 'success_html',
                    'response'     => $this->smartyview->smarty->fetch('movimiento_row.html', $data)
                );
                
                die(json_encode($respuesta));
            }
            else { 
                
                // revert attributes changes if necesary
                $this->revertOnCreateError($data);

                // Append model's errors
                $data['msg']->error .= $data['movimiento']->error->string;
            }
        } // if assignCreatePost
    } // function create_save
    
    public function transfer()
    {
        // chequeo y obtengo el usuario loggeado
        $data['logueado'] = $this->getUsuarioLogueado();

        // valido permisos
        $gruposValidos = array();
        // ej. array('venta','logistica','contable','directivo');
        $this->validarPermisos($data['logueado'], $gruposValidos);

        // Get an empty object
        $data['movimiento'] = new Movimiento();
        $data['usuario']	= $data['logueado'];
        
        // Message Handler
        $data['msg'] = new PwMsgHandler();
        
		// Seleccionar secciones
        $data['navbar_inventario'] = 'active';
        $data['sidebar_transferencias_create'] = 'active';
        
        // prepare object attributes
        $this->createPrepare($data);

        // if posting, try to save the new object
        if ($this->input->server('REQUEST_METHOD') === 'POST') {
            $this->transfer_save($data);
        }
        
        // load view
        $this->smartyview->render('movimiento_transfer.html', $data);
        
    } // function transfer
    
    private function transfer_save($data) 
    {
        // Creo un nuevo objeto para generar el descuento del almacen origen
        $data2['movimiento'] = new Movimiento();
        $data2['usuario']	 = $data['logueado'];
        $this->createPrepare($data2);
        if ($this->assignCreatePost($data2)) {

            // You could customize attributes here            
			$this->load->model('Producto');
			$data2['producto'] = new Producto($this->Producto->get_id_from_code($this->input->post('codigo-producto')));
            if ($data2['producto']->loteable == "0") {
                $data2['movimiento']->delete($data2['lotes']);
            }
            else {
                $data2['lote'] = new Lote();
                $data2['lote']->where('codigo',$this->input->post('codigo-lote'))
                    ->where_related('producto','id',$data2["producto"]->id)
                    ->get();
                
                if (!$data2['lote']->id) {
                    die('lote inexistente');
                    $data2['lote'] = new Lote();
                	$data2['lote']->codigo = $this->input->post('codigo-lote');
                	$data2['lote']->fecha_vencimiento = $this->input->post('fecha-vencimiento');
                	$data2['lote']->save($data2['producto']);
                }
			}
            $data2['movimiento']->delete($data2['remitos']);
            $data2['almacen'] = new Almacen($this->input->post('almacen-desde'));
            $data2['movimiento']->cantidad = $this->input->post('cantidad')*(-1);
            
            // Saving Object (feel free to edit)
            if ($this->saveEntity($data2)) { 
            
                // post processing object attributes
                $this->afterCreateSuccess($data2);
            }
            else { 
                
                // revert attributes changes if necesary
                $this->revertOnCreateError($data2);

                // Append model's errors
                $data['msg']->error .= $data2['movimiento']->error->string;
            }
            
        } // if assignCreatePost
        
        // Y ahora incremento el almacen destino
        // IMPORTANTE: Si el destino es un punto de venta no guardo información de Lote
        
        // assignCreatePost is defined on parent class and 
        // will assign all posting values to your attributes's class 
        // based on purposes definitions
        if ($this->assignCreatePost($data)) {

            // You could customize attributes here            
			$this->load->model('Producto');
			$data['producto'] = new Producto($this->Producto->get_id_from_code($this->input->post('codigo-producto')));
            if ($data['producto']->loteable == "0") {
                $data['movimiento']->delete($data['lotes']);
            }
            else {
                $data['lote'] = new Lote();
                $data['lote']->where('codigo',$this->input->post('codigo-lote'))
                    ->where_related('producto','id',$data["producto"]->id)
                    ->get();
                
                if (!$data['lote']->id) {
                    die('lote inexistente');
                    $data['lote'] = new Lote();
                	$data['lote']->codigo = $this->input->post('codigo-lote');
                	$data['lote']->fecha_vencimiento = $this->input->post('fecha-vencimiento');
                	$data['lote']->save($data['producto']);
                }
			}
            $data['movimiento']->delete($data['remitos']);
            $data['almacen'] = new Almacen($this->input->post('almacen-hasta'));
            
            if ($data['almacen']->punto_de_venta == '1') {
                unset($data['lote']);
            }
                
            
            // Saving Object (feel free to edit)
            if ($this->saveEntity($data)) { 
            
                // post processing object attributes
                $this->afterCreateSuccess($data);
                
                // Show success message in next view
                $data['msg']->success = 'Transferencia realizada correctamente';
                $data['msg']->persistSuccess();
                
                // redirects to edit
                redirect(base_url() . 'movimientos/browse/');
            }
            else { 
                
                // revert attributes changes if necesary
                $this->revertOnCreateError($data);

                // Append model's errors
                $data['msg']->error .= $data['movimiento']->error->string;
            }
            
        } // if assignCreatePost
    } // function transfer_save
    
    public function update($movimiento_id)
    {
        // chequeo y obtengo el usuario loggeado
        $data['logueado'] = $this->getUsuarioLogueado();

        // valido permisos
        $gruposValidos = array();
        // ej. array('venta','logistica','contable','directivo');
        $this->validarPermisos($data['logueado'], $gruposValidos);

        // get object to edit
        $data['movimiento'] = new Movimiento($movimiento_id);
        $data['usuario']	= $data['logueado'];
        //$data['lote']		= new Lote();
        
        // Message Handler
        $data['msg'] = new PwMsgHandler();

        // prepare object attributes
        $this->updatePrepare($data);

        // if posting, try to save modifications
        if ($this->input->server('REQUEST_METHOD') === 'POST') {
            $this->update_save($data);
        }

        // return view
		$response = array(
        	'responseType' => 'html',
            'response'     => $this->smartyview->smarty->fetch('movimiento_update.html', $data)
        );

		die(json_encode($response));
    } // function update

    private function update_save($data) 
    {
        // assignUpdatePost is defined on parent class and 
        // will assign all posting values to your attributes's class 
        // based on purposes definitions
        if ($this->assignUpdatePost($data)) {

            // You could customize attributes here
			$this->load->model('Producto');
            $data['producto'] = new Producto($this->Producto->get_id_from_code($this->input->post('codigo-producto')));
            if ($data['producto']->loteable == "0") {
                $data['movimiento']->delete($data['lotes']);
            }
            else {
                $data['lote'] = new Lote();
                $data['lote']->where('codigo',$this->input->post('codigo-lote'))
                    ->where_related('producto','id',$data["producto"]->id)
                    ->get();
                
                if (!$data['lote']->id) {
                    $data['lote'] = new Lote();
                }
                $data['lote']->codigo = $this->input->post('codigo-lote');
                $data['lote']->fecha_vencimiento = $this->input->post('fecha-vencimiento');
                $data['lote']->save($data['producto']);
			}
            
            // Saving Object and its relationships (feel free to edit)
            
                if ($this->saveEntity($data)) {                      
                    // post processing object attributes
                    $this->afterUpdateSuccess($data);
    
                    // responde con éxito
                    $respuesta = array(
                        'responseType' => 'success_html',
                        'response'     => $this->smartyview->smarty->fetch('movimiento_row.html', $data)
                    );
                    
                    die(json_encode($respuesta));
                }
                else { 
                    // revert attributes changes if necesary
                    $this->revertOnUpdateError($data);
    
                    // Append model's errors
                    $data['msg']->error .= $data['movimiento']->error->string;
                }
        } // if assignUpdatePost
    } // function update_save

    public function correccion_manual()
    {
        // chequeo y obtengo el usuario loggeado
        $data['logueado'] = $this->getUsuarioLogueado();

        // valido permisos
        $gruposValidos = array();
        // ej. array('venta','logistica','contable','directivo');
        $this->validarPermisos($data['logueado'], $gruposValidos);

        // Get an empty object
        $data['movimiento'] = new Movimiento();
        $data['usuario']	= $data['logueado'];
        $data['producto']	= new Producto();
        $data['almacenes']  = new Almacen();
        $data['almacenes']->get();

        // Message Handler
        $data['msg'] = new PwMsgHandler();
        
        // Seleccionar secciones
        $data['navbar_inventario'] = 'active';
        $data['sidebar_correccion_manual'] = 'active';
        
        // prepare object attributes
        $this->createPrepare($data);

        // if posting, try to save the new object
        if ($this->input->server('REQUEST_METHOD') === 'POST') {
            $this->correccion_manual_save($data);
        }

        // load view
        $this->smartyview->render('movimiento_correccion_manual.html', $data);

    } // function correccion_manual
    
    private function correccion_manual_save($data) {
        
        // Calculo el stock actual para cargar sólo la diferencia
        $this->load->model('Producto');
        $data2['producto'] = new Producto($this->Producto->get_id_from_code($this->input->post('codigo-producto')));
        $data2['movimiento'] = new Movimiento();
        $data2['movimiento']->select_sum('cantidad');
        $data2['movimiento']->where_related('producto','id',$data2['producto']->id);
        $data2['movimiento']->where_related('almacen','id',$this->input->post('almacen'));
        if ($data2['producto']->loteable) $data2['movimiento']->where_related('lote','id',$this->input->post('lote'));
        $data2['movimiento']->get();
		$cantidad_actual = $data2['movimiento']->cantidad;
                
        // assignCreatePost is defined on parent class and 
        // will assign all posting values to your attributes's class 
        // based on purposes definitions
        if ($this->assignCreatePost($data)) {

            // You could customize attributes here            
			$this->load->model('Producto');
			$data['producto'] = new Producto($this->Producto->get_id_from_code($this->input->post('codigo-producto')));
            if (($data['producto']->loteable == "0") || ($data['almacen']->punto_de_venta == '1'))  {
                unset($data['lote']);
            }
            $data['usuario'] = $data['logueado'];
            // Me interesa la diferencia entre la cantidad manual y la calculada por el sistema 
            $data['movimiento']->cantidad = $data['movimiento']->cantidad-$cantidad_actual;

            // Saving Object (feel free to edit)
            if ($this->saveEntity($data)) { 
            
                // post processing object attributes
                $this->afterCreateSuccess($data);
                
                // Show success message in next view
                $data['msg']->success = 'Corrección realizada exitosamente';
                $data['msg']->persistSuccess();
                
                // redirects to edit
                redirect(base_url() . 'movimientos/correccion_manual/');
            }
            else { 
                
                // revert attributes changes if necesary
                $this->revertOnCreateError($data);

                // Append model's errors
                $data['msg']->error .= $data['movimiento']->error->string;
            }
        }
    }
        
    public function browse()
    {
        // chequeo y obtengo el usuario loggeado
        $data['logueado'] = $this->getUsuarioLogueado();

        // valido permisos
        $gruposValidos = array();
        // ej. array('venta','logistica','contable','directivo');
        $this->validarPermisos($data['logueado'], $gruposValidos);

        // Message Handler
        $data['msg'] = new PwMsgHandler();

        // Seleccionar secciones
        $data['navbar_inventario'] 		  = 'active';
        $data['sidebar_transferencias_browse'] = 'active';
        
        // get object to delete
        $data['movimientos'] = new Movimiento();
        $data['movimientos']->where('tipo_movimiento_id',2)->order_by('fecha desc, id desc')->get();
        
        $this->smartyview->render('movimiento_browse.html',$data);
    } // function browse
    
    public function delete($id)
    {
        // chequeo y obtengo el usuario loggeado
        $data['logueado'] = $this->getUsuarioLogueado();

        // valido permisos
        $gruposValidos = array();
        // ej. array('venta','logistica','contable','directivo');
        $this->validarPermisos($data['logueado'], $gruposValidos);

        // get object to delete
        $data['movimiento'] = new Movimiento($id);
        
        if ($data['movimiento']->delete()) {

            // delete related actions based on purpose
            $this->afterDeleteSuccess($data);

            $respuesta = array(
                'responseType' => 'success',
            	'response'     => true
            );
            die(json_encode($respuesta));
        }
    } // function delete


	public function __construct() 
	{
		parent::__construct();
	}

} // class Movimientos

/* End of file movimientos.php */
/* Location: ./application/controllers/movimientos.php */